package ar.com.age.distribuidora.presentacion.controller;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.primefaces.context.RequestContext;

import ar.com.age.distribuidora.dominio.Cliente;
import ar.com.age.distribuidora.dominio.ListaDePrecio;
import ar.com.age.distribuidora.dominio.Localidad;
import ar.com.age.distribuidora.dominio.TipoIva;
import ar.com.age.distribuidora.dominio.TipoRubro;
import ar.com.age.distribuidora.presentacion.util.Mensajes;
import ar.com.age.distribuidora.presentacion.util.ServiceLocator;
import ar.com.age.distribuidora.presentacion.util.ValidadorTipoUsuario;

@ManagedBean
@ViewScoped
public class ClienteBean {

	private String nombreRegistrar;
	
	private String apellidoRegistrar;
	
	private String codigoRegistrar;
	
	private String telefonoRegistrar;
	
	private String direccionRegistrar;
	
	private String comentarioRegistrar;
	
	private String cuitRegistrar;
	
	private String razonSocialRegistrar;
	
	private Localidad localidadSeleccionadaRegistrar;
	
	private TipoRubro tipoRubroSeleccionadoRegistrar;
	
	private TipoIva tipoIvaSeleccionadoRegistrar;
	
	private ListaDePrecio listaDePrecioSeleccionadaRegistrar;
	
	private List<Localidad> localidades;
	
	private List<TipoRubro> tiposRubro;
	
	private List<TipoIva> tiposIva;
	
	private List<ListaDePrecio> listasDePrecio;
	
	private Cliente clienteSeleccionado;  
    
    private Cliente clienteSeleccionadoDetalles;  

	private String codigoBuscar;
	
	private String nombreBuscar;
	
	private String apellidoBuscar;
	
	private String estadoBuscar;
	
	private String cuitBuscar;
	
	private String razonSocialBuscar;
	
	private List<Cliente> clientes;

	private boolean panelBuscarVisibilidad;
	
	private boolean panelEditarVisibilidad;

	private boolean panelRegistrarVisibilidad;
	
	private Localidad localidadAux;
	
	private String nombreLocalidad;
	
	private TipoRubro tipoRubroAux;
	
	private String nombreTipoRubro;
	
	private TipoIva tipoIvaAux;
	
	private String nombreTipoIva;
	
	private ListaDePrecio listaDePrecioAux;
	
	private String nombreListaDePrecio;
	
    
	public ClienteBean() {

		ValidadorTipoUsuario.validarAdministrador();
		
		this.localidades = ServiceLocator.getLocalidadService().buscarTodos();
		this.tiposRubro = ServiceLocator.getDatosClienteService().buscarTodosTipoRubro();
		this.tiposIva = ServiceLocator.getDatosClienteService().buscarTodosTipoIva();
		this.listasDePrecio = ServiceLocator.getListaDePrecioService().buscarTodosListaDePrecio();

		this.panelEditarVisibilidad = false;
		this.panelRegistrarVisibilidad = true;
		this.panelBuscarVisibilidad = false;
	}

	public boolean isPanelBuscarVisibilidad() {
		return panelBuscarVisibilidad;
	}

	public void setPanelBuscarVisibilidad(boolean panelBuscarVisibilidad) {
		this.panelBuscarVisibilidad = panelBuscarVisibilidad;
	}

	public Localidad getLocalidadAux() {
		return localidadAux;
	}

	public void setLocalidadAux(Localidad localidadAux) {
		this.localidadAux = localidadAux;
	}

	public String getNombreLocalidad() {
		return nombreLocalidad;
	}

	public void setNombreLocalidad(String nombreLocalidad) {
		this.nombreLocalidad = nombreLocalidad;
	}

	public TipoRubro getTipoRubroAux() {
		return tipoRubroAux;
	}

	public void setTipoRubroAux(TipoRubro tipoRubroAux) {
		this.tipoRubroAux = tipoRubroAux;
	}

	public String getNombreTipoRubro() {
		return nombreTipoRubro;
	}

	public void setNombreTipoRubro(String nombreTipoRubro) {
		this.nombreTipoRubro = nombreTipoRubro;
	}

	public TipoIva getTipoIvaAux() {
		return tipoIvaAux;
	}

	public void setTipoIvaAux(TipoIva tipoIvaAux) {
		this.tipoIvaAux = tipoIvaAux;
	}

	public String getNombreTipoIva() {
		return nombreTipoIva;
	}

	public void setNombreTipoIva(String nombreTipoIva) {
		this.nombreTipoIva = nombreTipoIva;
	}

	public ListaDePrecio getListaDePrecioAux() {
		return listaDePrecioAux;
	}

	public void setListaDePrecioAux(ListaDePrecio listaDePrecioAux) {
		this.listaDePrecioAux = listaDePrecioAux;
	}

	public String getNombreListaDePrecio() {
		return nombreListaDePrecio;
	}

	public void setNombreListaDePrecio(String nombreListaDePrecio) {
		this.nombreListaDePrecio = nombreListaDePrecio;
	}

	public boolean isPanelEditarVisibilidad() {
		return panelEditarVisibilidad;
	}

	public void setPanelEditarVisibilidad(boolean panelEditarVisibilidad) {
		this.panelEditarVisibilidad = panelEditarVisibilidad;
	}

	public boolean isPanelRegistrarVisibilidad() {
		return panelRegistrarVisibilidad;
	}

	public void setPanelRegistrarVisibilidad(boolean panelRegistrarVisibilidad) {
		this.panelRegistrarVisibilidad = panelRegistrarVisibilidad;
	}

	public String getNombreRegistrar() {
		return nombreRegistrar;
	}

	public void setNombreRegistrar(String nombreRegistrar) {
		this.nombreRegistrar = nombreRegistrar;
	}

	public String getApellidoRegistrar() {
		return apellidoRegistrar;
	}

	public void setApellidoRegistrar(String apellidoRegistrar) {
		this.apellidoRegistrar = apellidoRegistrar;
	}

	public String getCodigoRegistrar() {
		return codigoRegistrar;
	}

	public void setCodigoRegistrar(String codigoRegistrar) {
		this.codigoRegistrar = codigoRegistrar;
	}

	public Localidad getLocalidadSeleccionadaRegistrar() {
		return localidadSeleccionadaRegistrar;
	}

	public void setLocalidadSeleccionadaRegistrar(
			Localidad localidadSeleccionadaRegistrar) {
		this.localidadSeleccionadaRegistrar = localidadSeleccionadaRegistrar;
	}

	public List<Localidad> getLocalidades() {
		return localidades;
	}

	public void setLocalidades(List<Localidad> localidades) {
		this.localidades = localidades;
	}

	public Cliente getClienteSeleccionado() {
		return clienteSeleccionado;
	}

	public void setClienteSeleccionado(Cliente clienteSeleccionado) {
		this.clienteSeleccionado = clienteSeleccionado;
	}

	public Cliente getClienteSeleccionadoDetalles() {
		return clienteSeleccionadoDetalles;
	}

	public void setClienteSeleccionadoDetalles(Cliente clienteSeleccionadoDetalles) {
		this.clienteSeleccionadoDetalles = clienteSeleccionadoDetalles;
	}

	public String getCodigoBuscar() {
		return codigoBuscar;
	}

	public void setCodigoBuscar(String codigoBuscar) {
		this.codigoBuscar = codigoBuscar;
	}

	public String getNombreBuscar() {
		return nombreBuscar;
	}

	public void setNombreBuscar(String nombreBuscar) {
		this.nombreBuscar = nombreBuscar;
	}

	public String getApellidoBuscar() {
		return apellidoBuscar;
	}

	public void setApellidoBuscar(String apellidoBuscar) {
		this.apellidoBuscar = apellidoBuscar;
	}

	public String getEstadoBuscar() {
		return estadoBuscar;
	}

	public void setEstadoBuscar(String estadoBuscar) {
		this.estadoBuscar = estadoBuscar;
	}

	public List<Cliente> getClientes() {
		return clientes;
	}

	public void setClientes(List<Cliente> clientes) {
		this.clientes = clientes;
	}
	
	public String getTelefonoRegistrar() {
		return telefonoRegistrar;
	}

	public void setTelefonoRegistrar(String telefonoRegistrar) {
		this.telefonoRegistrar = telefonoRegistrar;
	}

	public String getDireccionRegistrar() {
		return direccionRegistrar;
	}

	public void setDireccionRegistrar(String direccionRegistrar) {
		this.direccionRegistrar = direccionRegistrar;
	}

	public String getComentarioRegistrar() {
		return comentarioRegistrar;
	}

	public void setComentarioRegistrar(String comentarioRegistrar) {
		this.comentarioRegistrar = comentarioRegistrar;
	}

	public String getCuitRegistrar() {
		return cuitRegistrar;
	}

	public void setCuitRegistrar(String cuitRegistrar) {
		this.cuitRegistrar = cuitRegistrar;
	}

	public String getRazonSocialRegistrar() {
		return razonSocialRegistrar;
	}

	public void setRazonSocialRegistrar(String razonSocialRegistrar) {
		this.razonSocialRegistrar = razonSocialRegistrar;
	}

	public TipoRubro getTipoRubroSeleccionadoRegistrar() {
		return tipoRubroSeleccionadoRegistrar;
	}

	public void setTipoRubroSeleccionadoRegistrar(
			TipoRubro tipoRubroSeleccionadoRegistrar) {
		this.tipoRubroSeleccionadoRegistrar = tipoRubroSeleccionadoRegistrar;
	}

	public TipoIva getTipoIvaSeleccionadoRegistrar() {
		return tipoIvaSeleccionadoRegistrar;
	}

	public void setTipoIvaSeleccionadoRegistrar(TipoIva tipoIvaSeleccionadoRegistrar) {
		this.tipoIvaSeleccionadoRegistrar = tipoIvaSeleccionadoRegistrar;
	}

	public ListaDePrecio getListaDePrecioSeleccionadaRegistrar() {
		return listaDePrecioSeleccionadaRegistrar;
	}

	public void setListaDePrecioSeleccionadaRegistrar(
			ListaDePrecio listaDePrecioSeleccionadaRegistrar) {
		this.listaDePrecioSeleccionadaRegistrar = listaDePrecioSeleccionadaRegistrar;
	}

	public List<TipoRubro> getTiposRubro() {
		return tiposRubro;
	}

	public void setTiposRubro(List<TipoRubro> tiposRubro) {
		this.tiposRubro = tiposRubro;
	}

	public List<TipoIva> getTiposIva() {
		return tiposIva;
	}

	public void setTiposIva(List<TipoIva> tiposIva) {
		this.tiposIva = tiposIva;
	}

	public List<ListaDePrecio> getListasDePrecio() {
		return listasDePrecio;
	}

	public void setListasDePrecio(List<ListaDePrecio> listasDePrecio) {
		this.listasDePrecio = listasDePrecio;
	}

	public String getCuitBuscar() {
		return cuitBuscar;
	}

	public void setCuitBuscar(String cuitBuscar) {
		this.cuitBuscar = cuitBuscar;
	}

	public String getRazonSocialBuscar() {
		return razonSocialBuscar;
	}

	public void setRazonSocialBuscar(String razonSocialBuscar) {
		this.razonSocialBuscar = razonSocialBuscar;
	}

	

	// Metodos del Bean
	
	public String registrarCliente() {
		
		Cliente cliente = new Cliente();
		cliente.setApellido(apellidoRegistrar);
		cliente.setCodigo(codigoRegistrar);
		cliente.setEstado("Activo");
		cliente.setNombre(nombreRegistrar);
		cliente.setComentario(comentarioRegistrar);
		cliente.setTelefono(telefonoRegistrar);
		cliente.setDireccion(direccionRegistrar);
		cliente.setLocalidad(this.localidadSeleccionadaRegistrar);
		cliente.setCuit(cuitRegistrar);
		cliente.setRazonSocial(razonSocialRegistrar);
		cliente.setSaldo(0.0);
		cliente.setListadePrecio(listaDePrecioSeleccionadaRegistrar);
		cliente.setTipoIva(tipoIvaSeleccionadoRegistrar);
		cliente.setTipoRubro(tipoRubroSeleccionadoRegistrar);
		
		ServiceLocator.getClienteService().crearOEditar(cliente);
		
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "La operacion se ha realizado con exito.");  
		RequestContext.getCurrentInstance().showMessageInDialog(message);
		
		apellidoRegistrar = null;
		codigoRegistrar = null;
		nombreRegistrar = null;
		localidadSeleccionadaRegistrar = null;
		direccionRegistrar = null;
		telefonoRegistrar = null;
		comentarioRegistrar = null;
		cuitRegistrar = null;
		razonSocialRegistrar = null;
		listaDePrecioSeleccionadaRegistrar = null;
		tipoIvaSeleccionadoRegistrar = null;
		tipoRubroSeleccionadoRegistrar = null;
		
		return null;
	}
	
	
	public String actualizarCliente() {
		
		if (this.clienteSeleccionado != null) {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cliente",  "Cliente editado con exito.");  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
	        
	        if (this.clienteSeleccionado.getLocalidad() == null) {
	        	this.clienteSeleccionado.setLocalidad(this.localidadAux);
			}
	        
	        if (this.clienteSeleccionado.getTipoIva() == null) {
	        	this.clienteSeleccionado.setTipoIva(this.tipoIvaAux);
			}

	        if (this.clienteSeleccionado.getTipoRubro() == null) {
	        	this.clienteSeleccionado.setTipoRubro(this.tipoRubroAux);
			}
	        
	        if (this.clienteSeleccionado.getListadePrecio() == null) {
	        	this.clienteSeleccionado.setListadePrecio(this.listaDePrecioAux);
			}
	        
	        ServiceLocator.getClienteService().crearOEditar(this.clienteSeleccionado);
	        this.clienteSeleccionado = null;

	        // para reestablecer los valores
	        this.localidadAux = null;
	        this.nombreLocalidad = null;
	        // para volver a setear la lista con todas las ciudades
	        this.localidades = ServiceLocator.getLocalidadService().buscarTodos();
	        
	        this.tipoIvaAux = null;
	        this.nombreTipoIva = null;
			this.tiposIva = ServiceLocator.getDatosClienteService().buscarTodosTipoIva();
	        
	        this.tipoRubroAux = null;
	        this.nombreTipoRubro = null;
			this.tiposRubro = ServiceLocator.getDatosClienteService().buscarTodosTipoRubro();

	        this.listaDePrecioAux = null;
	        this.nombreListaDePrecio = null;
			this.listasDePrecio = ServiceLocator.getListaDePrecioService().buscarTodosListaDePrecio();

			this.panelEditarVisibilidad = false;
			this.panelRegistrarVisibilidad = true;
		 
			return null;
		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cliente",  "No se ha seleccionado un cliente.");  
	        FacesContext.getCurrentInstance().addMessage(null, message);  
			return null;
		}
	}
	
	public String editarCliente() {
		
		if (this.clienteSeleccionado != null) {
			
			this.panelEditarVisibilidad = true;
			this.panelRegistrarVisibilidad = false;
			this.panelBuscarVisibilidad = false;
			
			this.localidadAux = this.clienteSeleccionado.getLocalidad();
			this.nombreLocalidad = this.clienteSeleccionado.getLocalidad().getNombre();
			
			//para eliminar la localidad que tenia... asi no aparece dos veces
			for(int i = 0; i < localidades.size(); i++){
				if (localidadAux.getNombre().equals(localidades.get(i).getNombre())) {
					localidades.remove(i);
				}
			}
			
			this.tipoRubroAux = this.clienteSeleccionado.getTipoRubro();
			this.nombreTipoRubro = this.clienteSeleccionado.getTipoRubro().getRubro();
			
			for(int i = 0; i < tiposRubro.size(); i++){
				if (tipoRubroAux.getRubro().equals(tiposRubro.get(i).getRubro())) {
					tiposRubro.remove(i);
				}
			}
			
			this.tipoIvaAux = this.clienteSeleccionado.getTipoIva();
			this.nombreTipoIva = this.clienteSeleccionado.getTipoIva().getIva();
			
			for(int i = 0; i < tiposIva.size(); i++){
				if (tipoIvaAux.getIva().equals(tiposIva.get(i).getIva())) {
					tiposIva.remove(i);
				}
			}
			
			this.listaDePrecioAux = this.clienteSeleccionado.getListadePrecio();
			this.nombreListaDePrecio = this.clienteSeleccionado.getListadePrecio().getNombre();
			
			for(int i = 0; i < listasDePrecio.size(); i++){
				if (listaDePrecioAux.getNombre().equals(listasDePrecio.get(i).getNombre())) {
					listasDePrecio.remove(i);
				}
			}
			
			return null;

		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "No ha seleccionado ningun elemento.");  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;
		}	

	}
	
	public String eliminarCliente() {
		
		if (this.clienteSeleccionado != null) {

			try {
				ServiceLocator.getClienteService().eliminar(this.clienteSeleccionado);
			} catch (Exception e) {

				FacesMessage message2 = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", Mensajes.ELEMENTO_ASIGNADO);  
				RequestContext.getCurrentInstance().showMessageInDialog(message2);
				return null;
			}

			this.clienteSeleccionado = null;
			this.clientes = ServiceLocator.getClienteService().buscar(codigoBuscar, apellidoBuscar, nombreBuscar, cuitBuscar, razonSocialBuscar, estadoBuscar);

			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", Mensajes.OPERACION_EXITOSA);  
			RequestContext.getCurrentInstance().showMessageInDialog(message);
			
			return null;

		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", Mensajes.ELEMENTO_NO_SELECCIONADO);  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;
		}	

	}

	public String buscarCliente() {
		
		this.clientes = ServiceLocator.getClienteService().buscar(codigoBuscar, apellidoBuscar, nombreBuscar, cuitBuscar, razonSocialBuscar, estadoBuscar);

		if (this.clientes != null && !this.clientes.isEmpty()) {

			return null;

		} else {

			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "No se encotraron resultados para la busqueda.");  
			RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;		
		}
	}
	
	public void visibilizarBuscar() {
		
		panelBuscarVisibilidad = true;
		panelEditarVisibilidad = false;
		panelRegistrarVisibilidad = false;
	}
	
	public void visibilizarRegistrar() {
		
		panelBuscarVisibilidad = false;
		panelEditarVisibilidad = false;
		panelRegistrarVisibilidad = true;
	}
	
	public void volverBusqueda() {
		
		panelBuscarVisibilidad = true;
		panelEditarVisibilidad = false;
		this.clientes = ServiceLocator.getClienteService().buscar(codigoBuscar, apellidoBuscar, nombreBuscar, cuitBuscar, razonSocialBuscar, estadoBuscar);
	}
}
